#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//int* twoSum(int* nums, int numsSize, int target)
//{
//    int m = 0, n = 0;
//    int* Size = NULL;
//    for (m = 0; m < numsSize - 1; m++)
//    {
//        for (n = m + 1; n < numsSize; n++)
//        {
//            if (nums[m] + nums[n] == target)
//            {
//                Size = (int*)malloc(sizeof(int) * 2);
//                Size[0] = m;
//                Size[1] = n;
//                return Size;
//            }
//        }
//    }
//    return Size;
//}
//
//int main()
//{
//    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    int n = 0;
//    scanf("%d", &n);
//    int* Size = twoSum(arr, sz, n);
//    printf("%d  %d", *Size, *(Size + 1));
//    return 0;
//}


//struct ListNode {
//    int val;
//    struct ListNode* next;
//};
//
//struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
//{
//    struct ListNode* n1 = l1;
//    struct ListNode* n2 = l2;
//    struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));
//    struct ListNode* n4 = n3;
//    n4->val = 0;
//    while (n1 || n2)
//    {
//        if (n1 == NULL)
//        {
//            if (n4->val + n2->val > 9)
//            {
//                n4->val = ((n2->val) + (n4->val)) % 10;
//                n4->next = (struct ListNode*)malloc(sizeof(struct ListNode));
//                n4 = n4->next;
//                n2 = n2->next;
//                n4->val = 1;
//            }
//            else {
//                n4->val = ((n2->val) + (n4->val)) % 10;
//                n4->next = (struct ListNode*)malloc(sizeof(struct ListNode));
//                n4 = n4->next;
//                n2 = n2->next;
//                n4->val = 0;
//            }
//        }
//        else if (n2 == NULL)
//        {
//            if (n4->val + n1->val > 9)
//            {
//                n4->val = (n1->val) + (n4->val);
//                n4->next = (struct ListNode*)malloc(sizeof(struct ListNode));
//                n4 = n4->next;
//                n1 = n1->next;
//                n4->val = 1;
//            }
//            else
//            {
//                n4->val = (n1->val) + (n4->val);
//                n4->next = (struct ListNode*)malloc(sizeof(struct ListNode));
//                n4 = n4->next;
//                n1 = n1->next;
//                n4->val = 1;
//            }
//        }
//        else
//        {
//            if ((n1->val) + (n2->val) + (n4->val) > 9)
//            {
//                n4->val = ((n1->val) + (n2->val) + (n4->val)) % 10;
//                n4->next = (struct ListNode*)malloc(sizeof(struct ListNode));
//                n4 = n4->next;
//                n1 = n1->next;
//                n2 = n2->next;
//                n4->val = 1;
//            }
//            else
//            {
//                n4->val = ((n1->val) + (n2->val) + (n4->val)) % 10;
//                n4->next = (struct ListNode*)malloc(sizeof(struct ListNode));
//                n4 = n4->next;
//                n1 = n1->next;
//                n2 = n2->next;
//                n4->val = 0;
//            }
//        }
//    }
//    n4->next = NULL;
//    n4 = n3;
//    struct ListNode* n5 = n3;
//    while (n5)
//    {
//        if (n5->next == n4 && n4->val == 0)
//        {
//            n5->next = NULL;
//            free(n4);
//            n4 = NULL;
//        }
//        n5 = n5->next;
//    }
//    return n3;
//}

//int lengthOfLongestSubstring(char* s)
//{
//    int n = 0, m = 0;
//    int p = 0;
//    int num = 0;
//    while (s[n])
//    {
//        p = m;
//        while (p < n)
//        {
//            if (s[p] == s[n])
//            {
//                if (n - m > num)
//                {
//                    num = n - m ;
//                }
//                m = p + 1;
//                break;
//            }
//            p++;
//        }
//        n++;
//    }
//    if (n - m > num)
//    {
//        num = n - m;
//    }
//    return num;
//}
//
//int main()
//{
//    char arr[5000] = "abcabcbb";
//    int n = lengthOfLongestSubstring(arr);
//    printf("%d", n);
//    return 0;
//}

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    double arr[2001] = { 0 };
    int x = 0, y = 0, i = 0;
    int sum = nums1Size + nums2Size;
    while (i < sum)
    {
        if (nums1[x] > nums2[y] && x < nums1Size && y < nums2Size)
        {
            arr[i] = nums2[y];
            y++;
            i++;
        }
        else if (nums1[x] < nums2[y] && x < nums1Size && y < nums2Size)
        {
            arr[i] = nums1[x];
            x++;
            i++;
        }
        else if (x == nums1Size)
        {
            arr[i] = nums2[y];
            y++;
            i++;
        }
        else if (y == nums2Size)
        {
            arr[i] = nums1[x];
            x++;
            i++;
        }
    }
    if (sum % 2 == 0)
    {
        return (double)(arr[sum / 2 - 1] + arr[sum / 2]) / 2;
    }
    else
    {
        return (double)arr[sum / 2];
    }
}

int main()
{
    int arr1[] = { 1,3,5 };
    int arr2[] = { 2,4,8 ,9};
    int s1 = sizeof(arr1) / sizeof(arr1[0]);
    int s2 = sizeof(arr2) / sizeof(arr2[0]);
    double r=findMedianSortedArrays(arr1, s1, arr2, s2);
    printf("%lf", r);
    return 0;
}